﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
//day12
// 
//x1 --> A    
// '0' <= c <= '9' 注意 是先比较 '0' <= c  结果是真值1(以%c打印是个方块噢) 而不是ASCLL值
//1、请阅读以下程序，其运行结果是（ ）
//int main()
//{
//	char c = 'A';
//	//char a = ('0' <= c);
//	if ('0' <= c <= '9') printf("YES");
//	else printf("NO");
//	//printf("%d", a);
//	return 0;
//}
//A: YES B : NO C : YESNO D : 语句错误


//x 2 -->A                 1111 1111 1111 1010  因为最高位不是符号位
// 无符号整型提升 0 0 0 0  1111 1111 1111 1010  如果是short 最高位是符号位 整型提升也要升符号位
//2、假设编译器规定 int 和 short 类型长度分别为32位和16位，若有下列C语言语句，则 y 的机器数为（ ）
//unsigned short x = 65530;
//unsigned int y = x;
//A: 0000 7FFA B : 0000 FFFA C : FFFF 7FFA D : FFFF FFFA


//x 3 --> 0
//3、下列程序的输出结果是什么（ ）   ans的输出规律是 1 3 3 2 0 0
//int main()
//{
//    int n = 1001;
//    int ans = 0;
//    for (int i = 1; i <= n; ++i)
//    {
//        ans ^= i % 3;
//    }
//    printf("%d", ans);
//    return 0;
//}
//A: -2 B : 0 C : 1 D : 2


//x 4 --> A
// 单目运算符的优先级通常都比较高，具体情况可查阅运算符优先级表格
//4、C 语言中，下列运算符优先级最高的是()
//A: !B : % C : >> D : ==



//x5 --> C
//5、要使 a 的低四位翻转，需要进行操作是（ ）
//A : a | 0xF B : a & 0xF C : a ^ 0xF D : ~a



//二、编程题
//HJ11 数字颠倒
//输入一个整数，将这个整数以字符串的形式逆序输出
//程序不考虑负数的情况，若数字含有0，则逆序形式也含有0，如输入为100，则输出为001
//数据范围： 0≤n≤230−1 0≤n≤230−1
//输入描述：
//输入一个int整数
//输出描述：
//将这个整数以字符串的形式逆序输出
//输入：1516000
//输出：0006151
//https://www.nowcoder.com/practice/ae809795fca34687a48b172186e3dafe?tpId=37&&tqId=21234&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking

//数字转字符函数itoa  字符转数字 atoi 但是就麻烦了
//int main()
//{
//    int n = 0;
//    scanf("%d", &n);
//    if (n == 0)
//        printf("%d", 0);
//    while (n)
//    {
//        printf("%d", n % 10);
//        n /= 10;
//    }
//    return 0;
//}






//b 2
//HJ31 单词倒排
//对字符串中的所有单词进行倒排。
//说明：
//1、构成单词的字符只有26个大写或小写英文字母；
//2、非构成单词的字符均视为单词间隔符；
//3、要求倒排后的单词间隔符以一个空格表示；如果原字符串中相邻单词间有多个间隔符时，倒排转换后也只允许出现一个空格间隔符；
//4、每个单词最长20个字母；
//数据范围：字符串长度满足 1≤n≤10000 1≤n≤10000
//输入描述：
//输入一行，表示用来倒排的句子
//输出描述：输出句子的倒排结果
//输入：I am a student
//输出：student a am I
//https://www.nowcoder.com/practice/81544a4989df4109b33c2d65037c5836?tpId=37&&tqId=38366&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking

//isalpha 判断是否是字符
//******翻转字符串****** 但是我解决不了空格上的问题   再想
#include <string.h>
#include <ctype.h>
// void reverse(char* left, char* right)
// {
//     while(left<right)
//     {
//         char tmp = *left;
//         *left = *right;
//         *right = tmp;
//         right--;
//         left++;
//     }
// }
// int main() 
// {
//     char str[10001] = {0};
//     gets(str);
//     int len = strlen(str) - 1; int i = 0;
//     for(i=0; i<=len ;i++)
//     {
//         if(isalpha(str[i]) == 0)
//         {
//             str[i] = ' ';
//         }
//     }
//     reverse(str, str+len);

//     char* end = str;
//     while(*end != '\0')
//     {
//         char* start = end;
//         while(*end !='\0' && *end !=' ')
//         {
//             end++;
//         }
//         reverse(start, end-1);
//         if(*end!='\0')
//         {
//             end++;
//         }
//     }
//     printf("%s\n",str);
//     return 0;
// }


//这道题的解题思路不难，定义一个字符指针数组，用于保存每个单词的起始字符地址，接下来将非字母字符全部替换
//成为字符串结尾标志，则单词字符字母遇到结尾就结束了，相当于把一个字符串以非字母字符进行切割成为了多个字
//符串，最终对字符指针数组进行逆序打印每个单词即可
int main()
{
    char str[10001] = { 0 };
    while (gets(str))
    {
        int row = 0;
        char* ptr = str;
        char* word[500] = { 0 }; // 10000/20 最多就五百个单词
        while (*ptr)
        {
            if (isalpha(*ptr)) //如果是字符 把首地址存起来
            {
                word[row] = ptr;
                row++;
                //走完当前的单词     //*ptr不是字符并且不是\0时循环
                while ((isalpha(*ptr) != 0) && *ptr != '\0')
                {
                    ptr++;
                }
                continue; // \0时候就不要再执行下面语句了 不要也没事，因为初始化的str[]中都是\0
            }
            //分割每个单词
            *ptr = '\0';
            ptr++;
        }
        int i = 0;
        for (i = row - 1; i >= 0; i--) //row在上面存完最后一个字符首地址还会+1
        {
            printf("%s ", word[i]);
        }
    }
    return 0;
}



//再写一次吧  he %is a student 指针数组
//int main()
//{
//    char str[10000] = { 0 };
//    gets(str);
//
//    char* ptr = str;
//    char* word[500] = { 0 }; int row = 0;
//    while (*ptr)
//    {
//        if (isalpha(*ptr))
//        {
//            word[row] = ptr;
//            row++;
//            //走完当前单词
//            while (isalpha(ptr) != 0 && ptr != '\0')  //&& 两种情况都能控制用 &&
//            {
//                ptr++;
//            }
//            continue;  //可用可不用--
//        }
//        *ptr = '\0';
//        ptr++;
//    }
//    int i = 0;
//    for (i = row - 1; i >= 0; i--)
//    {
//        printf("%s ", word[i]);
//    }
//    return 0;
//}